// 路由的全局首位

// 权限控制逻辑
import router from "./index"
import store from "../store/index"

import {Message} from "element-ui"
import {getToken} from "@/utils/auth" // 从cookie获取令牌

const whiteList = ["/login"] //排除的路径

router.beforeEach(async (to, from, next) => {
  // 获取令牌判断用户是否登陆
  const hasToken = getToken()
  // 有令牌 表示已经登陆
  if (hasToken) {
    if (to.path === "/login") {
      // 已登录重定向到首页
      next({path: "/"})
    } else {
      //若用户角色已附加则说明动态路由已经添加
      const hasRoles = store.getters.roles && store.getters.roles.length > 0

      if (hasRoles) {
        //角色存在
        next() //继续即可
      } else {
        try {
          //先请求获取用户角色
          const {roles} = await store.dispatch("userStore/getInfo")

          // 根据当前用户角色动态生成路由
          const accessRoutes = await store.dispatch("permissionStore/generateRoutes", roles)

          // 添加这些路由至路由器
          router.addRoutes(accessRoutes)

          // 继续路由切换,确保addRoutes完成
          next({...to, replace: true})
        } catch (error) {
          // 出错需要重置令牌并重新登陆(令牌过期,网络错误等原因)
          await store.dispatch("userStore/resetToken")
          Message.error(error || "网络错误")
          next(`/login?redirect=${to.path}`)
        }
      }
    }
  } else {
    // 用户无令牌
    if (whiteList.indexOf(to.path) !== -1) {
      //白名单路由放过
      next()
    } else {
      // 重定向至登录页
      next({
        path: "/login",
        query: {
          redirect: to.fullPath,
        },
      })
    }
  }
})
